package com.woniuxy.controller;

import com.woniuxy.entity.Notification;
import com.woniuxy.entity.DTO.NotificationQueryDTO;
import com.woniuxy.service.INotificationService;
import com.woniuxy.util.PageResult;
import com.woniuxy.util.ResponseData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author pml
 * @Date 2025/7/17 1:53
 * @Description TODO
 * @Author 系统通知控制器
 * @Date 2025/7/16
 * @Description 处理系统通知相关的所有HTTP请求
 * 遵循RESTful API设计规范
 */
@RestController
@RequestMapping("/notification")
public class NotificationController {

    @Autowired
    private INotificationService notificationService;

    /**
     * 分页多条件查询通知列表
     * 使用GET请求，参数通过查询字符串传递
     * 支持按用户ID、是否已读、标题、时间范围等条件查询
     */
    @GetMapping("/list")
    public ResponseData<PageResult<Notification>> getNotificationList(NotificationQueryDTO queryDTO) {
        PageResult<Notification> pageResult = notificationService.getNotificationList(queryDTO);
        return ResponseData.ok(pageResult);
    }

    /**
     * 根据ID查询单个通知
     * 路径参数方式传递通知ID
     */
    @GetMapping("/{id}")
    public ResponseData<Notification> getNotificationById(@PathVariable String id) {
        Notification notification = notificationService.getById(id);
        return ResponseData.ok(notification);
    }

    /**
     * 新增系统通知
     * 使用POST请求，JSON格式传递通知信息
     * 适用于管理员发送系统通知的场景
     */
    @PostMapping
    public ResponseData addNotification(@RequestBody Notification notification) {
        // 设置初始值：未读状态
        notification.setIsRead(0);
        boolean success = notificationService.save(notification);
        return success ? ResponseData.ok() : ResponseData.fail(500, "新增通知失败");
    }

    /**
     * 更新通知信息
     * 使用PUT请求，JSON格式传递更新信息
     * 通常用于修改通知内容或标题
     */
    @PutMapping
    public ResponseData updateNotification(@RequestBody Notification notification) {
        boolean success = notificationService.updateById(notification);
        return success ? ResponseData.ok() : ResponseData.fail(500, "更新通知失败");
    }

    /**
     * 根据ID删除单个通知
     * 使用DELETE请求，路径参数传递通知ID
     */
    @DeleteMapping("/{id}")
    public ResponseData deleteNotification(@PathVariable("id") String id) {
        boolean success = notificationService.removeById(id);
        return success ? ResponseData.ok() : ResponseData.fail(500, "删除通知失败");
    }

    /**
     * 批量删除通知
     * 使用DELETE请求，请求体传递通知ID列表
     * 适用于用户清理多个通知的场景
     */
    @DeleteMapping("/batch")
    public ResponseData batchDeleteNotification(@RequestBody List<String> ids) {
        boolean success = notificationService.batchDelete(ids);
        return success ? ResponseData.ok() : ResponseData.fail(500, "批量删除失败");
    }

    /**
     * 标记单个通知为已读
     * 使用PUT请求，路径参数传递通知ID
     * 单独接口便于前端调用，语义清晰
     */
    @PutMapping("/read/{id}")
    public ResponseData markAsRead(@PathVariable String id) {
        boolean success = notificationService.markAsRead(id);
        return success ? ResponseData.ok() : ResponseData.fail(500, "标记已读失败");
    }

    /**
     * 批量标记通知为已读
     * 使用PUT请求，请求体传递通知ID列表
     * 适用于用户一次性将多个通知标记为已读
     */
    @PutMapping("/read/batch")
    public ResponseData batchMarkAsRead(@RequestBody List<String> ids) {
        boolean success = notificationService.batchMarkAsRead(ids);
        return success ? ResponseData.ok() : ResponseData.fail(500, "批量标记已读失败");
    }
}